﻿//StrategyReport.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Reporting
{
	using System;

	using Ecng.Common;

	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Базовый генератор отчета для стратегии.
	/// </summary>
	public abstract class StrategyReport
	{
		/// <summary>
		/// Инициализировать генератор.
		/// </summary>
		/// <param name="strategy">Стратегия, для которой необходимо сгенерировать отчет.</param>
		protected StrategyReport(Strategy strategy)
		{
			if (strategy == null)
				throw new ArgumentNullException("strategy");

			Strategy = strategy;
		}

		/// <summary>
		/// Стратегия, для которой необходимо сгенерировать отчет.
		/// </summary>
		public Strategy Strategy { get; private set; }

		/// <summary>
		/// Сгенерировать отчет. В дочерних класса в этом методе реализуется логика генерации.
		/// </summary>
		public abstract void Generate();

		/// <summary>
		/// Отформатировать время в строку.
		/// </summary>
		/// <param name="time">Время.</param>
		/// <returns>Отформатированная строка.</returns>
		protected virtual string Format(TimeSpan time)
		{
			return "{0:00}:{1:00}:{2:00}".Put(time.TotalHours, time.Minutes, time.Seconds);
		}

		/// <summary>
		/// Отформатировать время в строку.
		/// </summary>
		/// <param name="time">Время.</param>
		/// <returns>Отформатированная строка.</returns>
		protected virtual string Format(DateTime time)
		{
			return time.ToString();
		}

		/// <summary>
		/// Отформатировать направление заявки в строку.
		/// </summary>
		/// <param name="direction">Направление заявки.</param>
		/// <returns>Отформатированная строка.</returns>
		protected virtual string Format(OrderDirections direction)
		{
			return direction == OrderDirections.Buy ? "Покупка" : "Продажа";
		}

		/// <summary>
		/// Отформатировать состояние заявки в строку.
		/// </summary>
		/// <param name="state">Состояние заявки.</param>
		/// <returns>Отформатированная строка.</returns>
		protected virtual string Format(OrderStates state)
		{
			switch (state)
			{
				case OrderStates.None:
					return string.Empty;
				case OrderStates.Active:
					return "Активна";
				case OrderStates.Done:
					return "Не активна";
				case OrderStates.Failed:
					return "Ошибка";
				default:
					throw new ArgumentOutOfRangeException("state");
			}
		}

		/// <summary>
		/// Отформатировать тип заявки в строку.
		/// </summary>
		/// <param name="type">Тип заявки.</param>
		/// <returns>Отформатированная строка.</returns>
		protected virtual string Format(OrderTypes type)
		{
			switch (type)
			{
				case OrderTypes.Limit:
					return "Лимитная";
				case OrderTypes.Market:
					return "Рыночная";
				case OrderTypes.Repo:
					return "РЕПО";
				case OrderTypes.Rps:
					return "Внебиржевая";
				case OrderTypes.ExtRepo:
					return "РЕПО-М";
				default:
					throw new ArgumentOutOfRangeException("type");
			}
		}
	}
}